<?php

namespace app\common\helper;

class WxBizDataHelper
{
    /**
     * @var string
     */
    private $appId;

    /**
     * @var string
     */
    private $sessionKey;

    /**
     * error code 说明.
     * <ul>
     *    <li>-41001: encodingAesKey 非法</li>
     *    <li>-41003: aes 解密失败</li>
     *    <li>-41004: 解密后得到的buffer非法</li>
     *    <li>-41005: base64加密失败</li>
     *    <li>-41016: base64解密失败</li>
     * </ul>
     */
    public static $OK = 0;
    public static $IllegalAesKey = -41001;
    public static $IllegalIv = -41002;
    public static $IllegalBuffer = -41003;
    public static $DecodeBase64Error = -41004;

    /**
     * 构造函数
     * @param string $appId 小程序的appId
     * @param string $sessionKey 用户在小程序登录后获取的会话密钥
     */
    public function __construct(string $appId, string $sessionKey)
    {
        $this->appId = $appId;
        $this->sessionKey = $sessionKey;
    }


    /**
     * 检验数据的真实性，并且获取解密后的明文.
     * @param $encryptedData string 加密的用户数据
     * @param string $iv 与用户数据一同返回的初始向量
     * @param array $data 解密后的原文
     *
     * @return int 成功0，失败返回对应的错误码
     */
    public function decryptData(string $encryptedData, string $iv, array &$data): int
    {
        if (strlen($this->sessionKey) != 24)
        {
            return static::$IllegalAesKey;
        }
        $aesKey = base64_decode($this->sessionKey);
        if (strlen($iv) != 24)
        {
            return static::$IllegalIv;
        }
        $aesIV = base64_decode($iv);
        $aesCipher = base64_decode($encryptedData);
        $result = openssl_decrypt($aesCipher, "AES-128-CBC", $aesKey, 1, $aesIV);
        $dataObj = json_decode($result, true);
        if (!$dataObj)
        {
            return static::$IllegalBuffer;
        }
        $data = $dataObj;
        return static::$OK;
    }
}